Skip to content

zero size structs with extern (C) attribute #3093

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

WalterBright
Copy link
Member

Clear up documentation to correspond with dlang/dmd#13009

@dlang-bot
Copy link
Contributor

Thanks for your pull request, @WalterBright!

Bugzilla references

Your PR doesn't reference any Bugzilla issue.

If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog.

$(P Structs with no fields of non-zero size (aka $(I Empty Structs)) have a size of one byte.)
$(P A struct with no fields of non-zero size is an $(I Empty Struct).
An Empty Struct with a $(DDSUBLINK spec/attribute, linkage, Linkage Attribute) of `extern (C)` has a size of zero.
Otherwise, its size is one byte.)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is wrong. I think you wanted to say that empty extern (C) struct size is the same as with the underlying C compiler. Also you might want to add what happens if the C compiler simply disallows empty structs?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C11 6.7.2.1-8 says "If the struct-declaration-list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined."

Undefined behavior is not disallowed.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we encounter a C compiler with different behavior, we'll adjust the spec.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

From what I recall, the problem being that gcc and clang don't agree with each other on the same platform. So you could choose to imitate gcc on Linux, but then you're abi incompatible with clang on Linux - which someone might instead choose to use.

But that's all by the by.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Undefined behavior is not disallowed.

The point is, undefined behaviour allows refusal to compile. A reasonable C compiler could emit an error when encountering an empty struct.

If we encounter a C compiler with different behavior, we'll adjust the spec.

Better, but why not do it right away?

@dukc
Copy link
Contributor

dukc commented Sep 3, 2021

ping @WalterBright

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants